//package com.dominator.socket;
//
//
//import com.dominFramework.core.typewrap.Dto;
//import com.dominFramework.core.typewrap.Dtos;
//import com.dominFramework.core.utils.JsonUtils;
//import com.dominFramework.core.utils.SystemUtils;
//import com.dominator.enums.ReqEnums;
//import com.dominator.service.ApiMachineService;
//import com.dominator.utils.api.ApiMessage;
//import com.dominator.utils.dao.RedisUtil;
//import com.dominator.utils.encode.Des3Utils;
//import com.dominator.utils.exception.ApiException;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.lang.StringUtils;
//import org.springframework.context.ApplicationContext;
//import org.springframework.stereotype.Component;
//
//import javax.websocket.*;
//import javax.websocket.server.PathParam;
//import javax.websocket.server.ServerEndpoint;
//import java.io.IOException;
//import java.lang.reflect.Method;
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.concurrent.CopyOnWriteArraySet;
//
//@Component
//@ServerEndpoint(value = "/gameWebsocket/{machineId}")
//@Slf4j
//public class GameMachineWebSocket {
//    //线程安全的静态变量，表示在线连接数
//    private static volatile int onlineCount = 0;
//
//    //用来存放每个客户端对应的WebSocket对象，适用于同时与多个客户端通信
//    public static CopyOnWriteArraySet<GameMachineWebSocket> gameWebSocketSet = new CopyOnWriteArraySet<GameMachineWebSocket>();
//    //若要实现服务端与指定客户端通信的话，可以使用Map来存放，其中Key可以为用户标识
//    public static ConcurrentHashMap<Session, Object> gameWebSocketMap = new ConcurrentHashMap<Session, Object>();
//
//    private static RedisUtil ru = RedisUtil.getRu();
//
//
//    //与某个客户端的连接会话，通过它实现定向推送(只推送给某个用户)
//    private Session session;
//
//    /**
//     * 连接建立成功调用的方法
//     *
//     * @param session 可选的参数。session为与某个客户端的连接会话，需要通过它来给客户端发送数据
//     */
//    @OnOpen
//    public void onOpen(@PathParam("machineId") String machineId, Session session) {
//        this.session = session;
//        gameWebSocketSet.add(this);     //加入set中
//        gameWebSocketMap.put(session, this); //加入map中
//        addOnlineCount();    //
//
//       //机器登陆的实现
//
//
//
//
//
//
//
//
//    }
//
//    /**
//     * 连接关闭调用的方法
//     */
//    @OnClose
//    public void onClose(Session closeSession) {
//        gameWebSocketSet.remove(this); //从set中删除
//        gameWebSocketMap.remove(closeSession); //从map中删除
//        subOnlineCount();          //在线数减1
//        //--------------群发消息(多用于聊天室场景)
//        for (GameMachineWebSocket item : gameWebSocketSet) {
//            try {
//                item.sendAllMessage("有一连接关闭！当前在线人数为" + getOnlineCount());
//            } catch (IOException e) {
//                e.printStackTrace();
//                continue;
//            }
//        }
//        ApplicationContext act = ApplicationContextRegister.getApplicationContext();
//        act.getBean(ApiMachineService.class).delAllSession(closeSession.getId());
//    }
//
//    /**
//     * 收到客户端消息后调用的方法
//     *
//     * @param message   客户端发送过来的消息
//     * @param mySession 可选的参数
//     * @throws Exception
//     */
//    @OnMessage
//    public void onMessage(String message, Session mySession) throws Exception {
//        log.info("会话sessionId" + mySession.getId() + "来自客户端的消息:" + message);
//        ApiMessage msg = new ApiMessage(ReqEnums.REQ_SUCCESS);
//        Dto dto = Dtos.newDto();
//        try {
//            dto = JsonUtils.toDto(message);
//            dto.put("sessionId", mySession.getId());
//            String router = dto.getString("router");
//            if (SystemUtils.isEmpty(router) || StringUtils.lastIndexOf(router, ".") == StringUtils.INDEX_NOT_FOUND) {
//                throw new ApiException(ReqEnums.SYS_ROUTER_ILLEGAL);
//            }
//            String[] routerArr = StringUtils.split(router, ".");
//            if (routerArr.length != 2) {
//                throw new ApiException(ReqEnums.SYS_ROUTER_LENTH_ILLEGAL);
//            }
//            Object object = BeanLoader.getSpringBean(routerArr[0]);
//            Class c = object.getClass();
//            Method method = c.getMethod(routerArr[1], Dto.class);
//            Object resultObj = method.invoke(object, dto);
//            if (resultObj instanceof ApiMessage) {
//                msg = (ApiMessage) resultObj;
//            } else {
//                return;
//            }
//
////             ApplicationContext act = ApplicationContextRegister.getApplicationContext();
////              msg=act.getBean(SocketService.class).onMessageService(dto);
//
//        } catch (ApiException e) {
//            msg.setCode(e.getCode());
//            msg.setMessage(e.getMessage());
//       //     msg.setRouter(dto.getString("router"));
//        } catch (Exception e) {
//            e.printStackTrace();
//            msg = new ApiMessage(ReqEnums.SYS_ERROR, dto.getString("router"));
//        } finally {
//            sendToOne(msg, mySession);
//        }
//    }
//
//
//    /**
//     * 发生错误时调用
//     *
//     * @param session
//     * @param error
//     */
//    @OnError
//    public void onError(Session session, Throwable error) {
//        log.error("发生错误");
//        log.info("会话id" + session.getId());
//        try {
//            Object object = BeanLoader.getSpringBean("ApiMachineService");
//            Class c = object.getClass();
//            Method method = c.getMethod("delAllSession", String.class);
//            method.invoke(object, session.getId());
//        } catch (Exception e) {
//            log.error("删除会话失败");
//        }
//
//
////        ApplicationContext act = ApplicationContextRegister.getApplicationContext();
////        act.getBean(ApiMachineService.class).delAllSession(session.getId());
//    }
//
//
//    //给所有客户端发送信息
//    public void sendAllMessage(String message) throws IOException {
//        this.session.getBasicRemote().sendText(message);
//    }
//
//    //定向发送信息
//    public void sendMessage(Session mySession, String message) throws IOException {
//        synchronized (this) {
//            try {
//                if (mySession.isOpen()) {
//                    //该session如果已被删除，则不执行发送请求，防止报错
//                    mySession.getBasicRemote().sendText(message);
//                } else {
//                    log.info("会话已经关闭");
//                }
//            } catch (IOException e) {
//                e.printStackTrace();
//                log.error("发送失败" + e.getMessage());
//            }
//        }
//    }
//
//
//    public void sendToOne(ApiMessage msg, Session mySession) {
//        //推送给单个客户端
//        for (Session session : gameWebSocketMap.keySet()) {
//            if (session.equals(mySession)) {
//                WebSocketTools item = (WebSocketTools) gameWebSocketMap.get(mySession);
//                try {
//                    item.sendMessage(mySession, Des3Utils.encResponse(msg));
//                } catch (IOException e) {
//                    e.printStackTrace();
//                    log.error("发送失败" + e.getMessage());
//
//                }
//            }
//
//
//        }
//    }
//
//
//    public static void sendToId(Object msg, String sessionId) {
//        for (Session session : gameWebSocketMap.keySet()) {
//            if (session.getId().equals(sessionId)) {
//                WebSocketTools item = (WebSocketTools) gameWebSocketMap.get(session);
//                try {
//                    item.sendMessage(session, Des3Utils.encResponse(msg));
//                } catch (IOException e) {
//                    e.printStackTrace();
//                    log.error("发送失败" + e.getMessage());
//                }
//            }
//        }
//    }
//
//
//    public static synchronized int getOnlineCount() {
//        return onlineCount;
//    }
//
//    public static synchronized void addOnlineCount() {
//        GameMachineWebSocket.onlineCount++;
//    }
//
//    public static synchronized void subOnlineCount() {
//        GameMachineWebSocket.onlineCount--;
//    }
//
//
//
//
//}
